package main

import (
	"fmt"
	"strconv"
)

// 自定义 新类型
// 自定义类型 编译后 依然存在
type myInt int

// 类型别名
// 类型别名 编译后 定义的 类型别名将不存在 变为 别名对应的类型 只存在于代码中
type aliasInt = int

func f1() {
	fmt.Println("exec f1()")
}

func f2() string {
	return fmt.Sprintln("exec f2()")
}

// 函数 也可作为 参数 的类型
func f3(f func() string) {
	fmt.Println("exec f3()")
	fmt.Printf(f())
}

// 函数 还可以作为 返回值 类型
func f4(x, y int) func() string {
	return func() string {
		return "inner func: " + strconv.Itoa(x+y) + "\n"
	}
}

func main() {
	// 函数类型 参数
	mf1 := f1
	mf1()
	fmt.Printf("mf1: %T\n", mf1)

	fmt.Println("=========================================================")

	mf2 := f2
	fmt.Printf(mf2())
	fmt.Printf("mf2: %T\n", mf2)

	fmt.Println("=========================================================")

	mf3 := f3
	mf3(mf2)
	fmt.Printf("mf3: %T\n", mf3)

	fmt.Println("=========================================================")

	mf3(f4(2, 2))
	fmt.Printf("f4: %T\n", f4)
}
